home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Tool Chest / Development Tools & Languages / Dylan Related / Dylan Interim Manual / errata 16-Mar-95 next >
Encoding:
Text File  |  1995-03-16  |  22.2 KB  |  664 lines  |  [TEXT/ttxt]

  1. DYLAN INTERIM REFERENCE MANUAL ERRATA            updated 3/16/95
  2. =====================================
  3.  
  4. This is a list of known errors and omissions in the June 1994 Dylan Interim
  5. Reference Manual (DIRM).  Many of the items in the errata sheet are
  6. specific corrections, but some of the items are questions that point to
  7. places where we know the DIRM is inconsistent or unclear.  These questions
  8. will be resolved in the new Dylan language reference, which will be
  9. published in 1995.  In the interim, we hope that this errata sheet will be
  10. helpful to people who want to learn about Dylan or who are using an
  11. early Dylan implementation.
  12.  
  13. MISSING or PARTIALLY INCORPORATED
  14. ---------------------------------
  15.  
  16.    The classes <object>, <collection>, and <pair> don't have explicit
  17.    definitions anywhere.
  18.  
  19.    The manual notation of double arrow for "evaluates to" or
  20.    "returns value" is not explained anywhere.
  21.  
  22. Missing or partially incorporated language design decisions:
  23.  
  24.  - Parameterized Types
  25.    (The interim book includes the general material, such as <type> and
  26.    subtype?, and the part about ambiguous methods signaling an error.  The
  27.    limited and union types are not incorporated.)
  28.  - Evaluation of Top Level Forms
  29.  - Collection allocation (Rob MacLachlan, Feb 18th)
  30.  - Macro specification (Apple, 6/17)
  31.  - Keyword default syntax (Keith Playford, May 18th)
  32.  - Allow IEEE Float Comparisons V3
  33.  - Accessor Method Signatures V4
  34.  - Implicit GF Parameter Lists V4
  35.  - Optional-body-intermediate (Moon, June 24th)
  36.  - expressions in detail-list (Moon, June 24th)
  37.  - "Not Identical" operator (Keith Playford)
  38.  - Keyword parameter types V6 (Gwydion Group, 9/7)
  39.  - Block Dynamic Extent V3 (Rob MacLachlan, 9/22)
  40.  - No More Than One Cleanup (Rob MacLachlan, 9/12)
  41.  - Unreserved Define Words V4 (Keith Playford, 9/28)
  42.  - Defining-macro syntax (Keith Playford, 9/6)
  43.  - Free References in Macros (Apple, 9/16)
  44.  - Template Hygiene Violation (Moon, 9/11)
  45.  - Apple Extensions Grammar V3 (Moon, 9/29)
  46.  - ?name:constraint instead of ?constraint:name (Macro Issue 5)
  47.  - ?expression instead of ?expr (Macro Issue 6)
  48.  - Add CL "multiple-value-prog1" functionality V4 (Tim McNerney, 9/27)
  49.  - Unreserved Intermediate Words V3 (Moon, 9/30)
  50.  
  51.    Important note:
  52.    ---------------
  53.    Most of the proposals referenced above are new decisions since the
  54.    release of the DIRM, and have not been written up for release to the
  55.    public.  They are listed here for completeness.  Many of them are
  56.    related to the macro system which was recently added to the language,
  57.    but which has not yet been written up for public distribution.
  58.  
  59.    The above missing or partially incorporated proposals have not been
  60.    entirely incorporated into the errata sheet.  For example, some of the
  61.    corrections to Appendix B may be superseded by the recently accepted
  62.    macro proposals.
  63.  
  64. GENERAL COMMENTS
  65. ----------------
  66.  
  67. Categories of classes (such as [Abstract Class], [Instantiable Class], and
  68. [Sealed Class]) should be reviewed.  Many of them are wrong or incomplete.
  69. Likewise for functions/GFs/methods (although this is not so bad as the
  70. classes now).
  71.  
  72. Lots of terminology is inconsistent.  For example:
  73.      execute/evaluate
  74.      statement/expression/form
  75.  
  76. Error reporting should be reviewed and made consistent.  Sometimes a
  77. situation "is an error," sometimes "an error is signaled," sometimes "an
  78. implementation may choose to signal an error," etc.
  79.  
  80. The book is not always clear about what environment things are evaluated in.
  81. This should be checked and clarified where it is ambiguous.
  82.  
  83. In definitions, parameter names such as "integer1" (used to indicate
  84. specializers) and metasyntactic words like "implicit-body" should be
  85. reviewed for correctness.  Perhaps we should come up with new conventions
  86. that make the specializers of parameters more explicit.
  87.  
  88. SPECIFIC COMMENTS
  89. -----------------
  90.  
  91. p.xvii [Acknowledgements]
  92.  
  93.    Tim McNerney's name was incorrectly spelled.
  94.  
  95. p.8 [lexical notation]
  96.  
  97.    What is the legal Dylan character set?
  98.  
  99.    On comments that whitespace is ignored:  this is not true with
  100.    regard to strings, character constants, literals, or // comments.
  101.  
  102.    The specification of comments is incomplete.
  103.  
  104.    Must comments be separated by whitespace from the preceding
  105.    identifier?  is foo//bar an eight character symbol or a three
  106.    character one followed by a comment?
  107.  
  108.    Are \-escapes inside #"..." symbols interpreted the same way as
  109.    \-escapes inside strings?  Yes.
  110.  
  111.    The accepted \-escapes in strings should be listed here.
  112.    They are:
  113.         \a      bell ("alarm")
  114.         \b      backspace
  115.         \e      escape
  116.         \f      formfeed
  117.         \n      newline
  118.         \r      return
  119.         \t      tab
  120.         \0      null
  121.  
  122.    This section doesn't incorporate the decision that two consecutive
  123.    literal strings count as one string.
  124.  
  125. pp.9-10 [getters and setters]
  126.  
  127.    The relationship between foo, foo-setter, and foo := bar isn't explained
  128.    well.  Clarify that the -setter suffix is simply a convention, but :=
  129.    depends on it.
  130.  
  131. p.11 [define variable examples]
  132.  
  133.    define variable is shown returning a value.  (or at least,
  134.    printing the name of the variable defined.)  This is inconsistent
  135.    with other examples.
  136.  
  137. p.14 [statement bodies]
  138.  
  139.    The description doesn't explain that if there are zero expressions, an
  140.    implicit body returns #f.
  141.  
  142. pp.15-16 [operator escape character]
  143.  
  144.    We need to figure out whether + (for example) calls \+ in the current
  145.    scope or \+ in the Dylan module.
  146.  
  147. pp.16, 25 [special syntax for element/aref]
  148.  
  149.    We need to figure out whether [...] calls element in the current scope
  150.    or element in the Dylan module.
  151.  
  152. p.16 [slot reference syntax]
  153.  
  154.    What is the precedence of . ?  It binds tighter than any binary
  155.    operator.
  156.  
  157.    Is whitespace allowed around . ?  Yes, but the stylistic convention
  158.    is not to use whitespace.
  159.  
  160. p.17 [Syntax of Dylan Files]
  161.  
  162.    Since module: is required, the header must consist of one or more
  163.    key-value pairs (not zero or more).
  164.  
  165. p.18 [standard header keywords]
  166.  
  167.    The language: keyword was removed in Design Note 33.  It should be
  168.    restored.
  169.  
  170.    Can the header keywords author:, copyright:, and version: appear
  171.    more than once?
  172.  
  173. p.19-22 [define variable]
  174.  
  175.    The syntax of variable bindings should specify commas between the
  176.    variables.
  177.  
  178.    This does not say whether an unspecified type clause is equivalent to
  179.    ":: <object>."
  180.  
  181.    When binding multiple values, may the same variable name appear
  182.    more than once in the bindings list?  if so, what does this mean?
  183.  
  184. p. 20, 47, 156 [local declaration values]
  185.    The DIRM fails to say what the following definition would return if it
  186.    executed:
  187.       define method foo ()
  188.         bar();
  189.         let x = baz();
  190.       end method;
  191.    The answer is that local declarations presume implicit body semantics.
  192.    The "body" is empty and, therefore, returns #f.
  193.  
  194. p.24 [examples]
  195.  
  196.    define variable is shown returning a value.  (or at least,
  197.    printing the name of the variable defined.)    This is inconsistent
  198.    with other examples.
  199.  
  200. p.24, 25 [:= insufficiently defined]
  201.    The description of := should say that the new-value expression is
  202.    evaluated before the place expression.  This makes using := consistent
  203.    with calling -setter functions directly.
  204.  
  205. p.25 [extended form]
  206.  
  207.    "The evaluation time of the variable element-setter, which this
  208.    expression is defined to invoke, is unspecified":  should also mention
  209.    aref-setter.
  210.  
  211. p.27 [definition of ~]
  212.  
  213.    "=> boolean" is misleading, since there is no <boolean> class.
  214.    In fact, any value could be returned!
  215.  
  216. p. 29, 30 [case and select optional semicolon]
  217.    As described, a semicolon is required after body_n even if no otherwise
  218.    clause appears.  Reasoning that the semicolon is used as a separator
  219.    rather than terminator, it should be removed here.  Checking
  220.    the grammar in the interim report also seems to indicate that semicolon
  221.    is used as a separator between constituents_opt in a case-body.  Thus,
  222.    case should look something like this:
  223.  
  224.            case
  225.                    test_1 => body_1 ;
  226.                    ...
  227.                    test_n => body_n [ ;
  228.                    otherwise => otherwise-body ] [;]
  229.                    end [case]
  230.  
  231.    and select should read as follows:
  232.  
  233.            select ( target-form [ by test ] )
  234.                    match_1a , ... match_1n => body_1;
  235.                    ...
  236.                    match_ma , ... match_mn => body_m [ ;
  237.                    otherwise => otherwise-body ] [;]
  238.                    end [select]
  239.  
  240. p. 30 [select conflicting statements]
  241.    The sentence "each match is evaluated to produce a match object"
  242.    erroneously implies that all matches are evaluated before the match
  243.    objects are compared with the test.  The sentence should be replaced
  244.    by "the match is evaluated to produce a match object."
  245.  
  246. p.31 [| and &]
  247.  
  248.    Is \| (form1, form2) equivalent to form1 | form2?
  249.    Is \& (form1, form2) equivalent to form1 & form2?
  250.  
  251. p.32 [for]
  252.  
  253.    for is a macro, not a special form.
  254.  
  255.    "for allows one or more clauses" is not completely correct.
  256.  
  257.    commas are not shown where they're needed in for syntax.
  258.  
  259. p.33 [numeric clauses in for]
  260.  
  261.    Clarify that the increment defaults to 1 regardless of the type of the
  262.    variable.
  263.  
  264. p.33 [collection clauses in for]
  265.  
  266.    When is forward-iteration-protocol(collection) evaluated?
  267.  
  268.    In general, all the collection clause steps should make clear exactly
  269.    when and which functions from the iteration protocol are used.
  270.  
  271. p.34 [step 7 in for]
  272.  
  273.   "add" means "uses the predefined generic function +"
  274.  
  275. p.35 [non-local exits]
  276.  
  277.    Clarify that "Normally..." means something like "In the absence of
  278.    non-local exits..."
  279.  
  280.    What type of object is the exit procedure?  It is a <function>.
  281.  
  282. p. 35, 36 [block no semantics]
  283.  
  284.    There is no discussion of the semantics of interleaving cleanup and
  285.    exception clauses.  [Since the DIRM, the block form has been simplified
  286.    and interleaving of cleanup and exception clauses is no longer allowed.]
  287.  
  288. p.39... [Comparisons chapter]
  289.  
  290.    Should things like < and <= be defined as [Function] or [Operator]?
  291.    Should they be defined as \<?
  292.  
  293.    It is unclear from the descriptions of >, <= and >= whether they are
  294.    implemented with only < or with both < and =.  They are implemented with
  295.    only < right now, but IEEE might change that.
  296.  
  297.    Regarding == and builtin number classes:  does this hold for
  298.    floating point, double precision floating point, etc.?  Definitely yes.
  299.  
  300. pp.43-45
  301.    "A complete description of parameter lists and congruency is given in
  302.    the Function Applicability section": There is no such section.
  303.  
  304. p.44, 70 [implicit generic function signatures]
  305.  
  306.    When define method implicitly creates a generic function, it's not said
  307.    how this default generic function's parameter list is computed.  (It
  308.    isn't the same as the method's parameter list.) The DIRM needs to specify
  309.    how Dylan computes implicit generic function signatures.
  310.  
  311.    "parameters bound as lexicals over scope of body" might be thought to
  312.    include result "parameters."  Clarify.
  313.  
  314. p.44 [method], 48 [parameter lists], and 53-54 [result values]
  315.  
  316.    These sections don't adequately explain the syntax of value declarations.
  317.    In particular, they don't explain the necessity of parentheses around
  318.    value declarations.  The correct syntax is as defined in the BNF.
  319.  
  320. p.47 [local]
  321.  
  322.    Is it possible to construct a local generic function by doing something
  323.    like the following:
  324.  
  325.         local method double(x :: <number>)
  326.                 x + x
  327.               end method double,
  328.               method double(x :: <string>)
  329.                 concatenate(x, x)
  330.               end method double;
  331.         double
  332.  
  333. p.49 [#all-keys]
  334.  
  335.    #all-keys should have a similar statement to #key that the
  336.    parameter list could also specify #rest.
  337.  
  338.    It should specify more clearly here that if a function takes keyword
  339.    parameters, taking a rest parameter still limits it to accepting only
  340.    keyword/value pairs.
  341.  
  342.    What #all-keys means for generic functions should be stated here
  343.    as well as on p.55.
  344.  
  345. p. 51 [type specializers]
  346.  
  347.    "A specializer can be any expression...": This should note that
  348.    syntax is limited; binary operators would have to be parenthesized.
  349.  
  350.    What is the scope/environment that types are evaluated in?  is
  351.    evaluation left to right?
  352.  
  353. p. 52 [keyword default values syntax]
  354.  
  355.    The syntax for keyword default values changed after the DIRM went to
  356.    press.  The correct syntax uses '=' instead of parentheses:
  357.  
  358.       define method initialize (xyzzy :: <my-object>, #key size = 1);
  359.  
  360.    or
  361.  
  362.       ... , #key size: the-size = 1);
  363.  
  364.  
  365. p. 55 [Use = for keyword parameter defaults]
  366.    Default values for keyword parameters are now specified with = (see
  367.    proposal "Keyword default syntax," Keith Playford, May 18th)
  368.  
  369. p. 56 [method specificity]
  370.  
  371.    What sort of error is "ambiguous method error"?
  372.  
  373.    Type equivalence should be defined.
  374.  
  375. p. 61 [passing different arguments to next-method]
  376.  
  377.    This should make a note about the leftmost keywords being used
  378.    where duplicates occur, so in order to replace a key/value pair,
  379.    just prepend to the rest list.
  380.  
  381. p. 62 [generic-function-methods]
  382.  
  383.    Is generic-function-methods allowed to return a collection instead of a
  384.    sequence?
  385.  
  386.    add-method can signal a <sealed-object-error>.
  387.  
  388. pp.65-66 [<function>, <generic-function>, and <method>]
  389.  
  390.    Shouldn't there be a values: init-keyword for <generic-function>?  Did
  391.    we forget to add that?  If so, we also forgot to add a
  392.    function-value-specializers function or an additional value from
  393.    function-specializers or function-arguments.
  394.  
  395. p. 67 [slots]
  396.  
  397.    "Slots are local storage within instances" is misleading, given other
  398.    allocation types.  "Local storage within instances or classes is in
  399.    slots" might be better.
  400.  
  401. p. 63 [function-arguments]
  402.  
  403.    Function-arguments returns the symbol #"all" (the existing text doesn't
  404.    use symbol syntax)
  405.  
  406. p.69 [defining new classes]
  407.  
  408.    "New classes are created with define class": New classes can also be
  409.    created through make but this is not documented here.
  410.  
  411. p.80
  412.  
  413.    (second line) "...some keyword is neither usable for slot initialization
  414.    nor recognized by some initialize method ..."  The word 'recognized'
  415.    should instead be the term 'permitted.'
  416.  
  417. p.83 [Initialization Argument Inheritance]
  418.  
  419.    What is the default type if none is explicitly specified in the local
  420.    specification?
  421.  
  422. pp.83-84 [Initialization of Class Allocated Slots]
  423.  
  424.    Clarify that this refers to what the default make method does.
  425.  
  426. p.84 [slot-initialized?]
  427.  
  428.    What does slot-initialized? do on a virtual slot?
  429.  
  430. p.86 [class-for-copy]
  431.  
  432.    Clarify that class-for-copy can be extended for non-collection classes.
  433.  
  434. p.87 [<class>]
  435.  
  436.    Should there be a default for superclasses:?  There isn't one for define
  437.    class.
  438.  
  439.    Do we need init-keywords for abstract: and primary:?
  440.  
  441.    What about initarg specifications?  Inherited slot specifications?
  442.  
  443. Chapter 8 [Controlling Dynamism]
  444.  
  445.    This chapter is far too terse!
  446.  
  447.    This chapter uses some undefined terms:
  448.      explicitly defined
  449.      explicitly known
  450.      disjoint
  451.  
  452. p.95 [Collections graphic]
  453.  
  454.    The graphic at the beginning of the chapter is inaccurate about which
  455.    classes are abstract.  Some classes, such as <string> are both abstract
  456.    and instantiable.
  457.  
  458. p.96 [size, etc]
  459.  
  460.    Is size required to terminate?  Are any collection methods required to
  461.    terminate?
  462.  
  463. p.96 [mapping functions such as do and map, etc]
  464.  
  465.    The function parameters to the mapping functions should be listed as
  466.    "function" instead of "procedure."  Also clarify how many arguments the
  467.    called function will receive.
  468.  
  469.    What should mapping functions do when the arguments are unbounded
  470.    collections?  Should functions which make no sense for unbounded
  471.    collections have methods that explicitly signal errors?
  472.  
  473. p. 98 [map-into example]
  474.  
  475.    The example on page 98 for 'map-into' is incorrect. The text on page 97
  476.    describes the correct behavior. map-into returns the mutable-collection 
  477.    argument, but 'procedure' is not applied to this argument as the example 
  478.    implies.
  479.  
  480. p. 100 [skip parameter of find-key]
  481.  
  482.    The "skip" parameter of "find-key" is currently close to useless because
  483.    the elements are not examined in a known order.  For explicit key
  484.    collections we can't assume any "natural order".
  485.  
  486. pp.101-109 [Functions for Sequences]
  487.  
  488.    The "Collections" chapter probably needs to make stronger statements for
  489.    many collection and sequence operations concerning the order in which
  490.    collection elements are "processed" and the order in which elements will
  491.    appear in the operation's result value.
  492.  
  493.    Why are add and remove guaranteed to copy (that is, the resultant
  494.    sequence may share no structure with the original sequence)?
  495.  
  496.    concatenate is contradictory about whether a new sequence is created
  497.    with make, or structure sharing is done.
  498.  
  499.    Does last signal an error if its argument sequence is unbounded?
  500.  
  501. p.105 [remove duplicates does NOT remove first occurrence?]
  502.  
  503.    When "remove-duplicates" or "remove-duplicates!" finds duplicate
  504.    elements, should it remove the first or later occurrences.  The examples
  505.    show that these routines remove later occurrences, but is this guaranteed
  506.    behavior?
  507.  
  508. p. 107 [replace-subsequence! overspecified]
  509.  
  510.    From the description of replace-subsequence!:
  511.       result-sequence will not share structure with insert-sequence.
  512.    The requirement, as it stands, means any method for two lists must scan
  513.    the result to make sure no part of insert-sequence is part of the result.
  514.    If there is incidental sharing, then the method must make new pairs and
  515.    replace those shared pairs.  This should probably be respecified,
  516.  
  517. p.107, 108 [reverse! and sort!]
  518.  
  519.    The definitions of reverse! and sort! probably should be explicit that
  520.    you should set something to the result (in order to avoid the usual
  521.    screw).
  522.  
  523. p.108 [first-, second-, and third-setter]
  524.  
  525.    The descriptions for first-, second-, and third-setter should have
  526.    mutable-sequence instead of sequence.
  527.  
  528. p.110 [<byte-string>]
  529. p.112 [<string>]
  530.  
  531.    What is the default for fill: in a <byte-string>?
  532.    What is the default for fill: in a <string>?
  533.  
  534. p.115 [deques]
  535.  
  536.    Should push, pop, and push-last be called push!, pop!, and push-last!?
  537.  
  538. p.120 [< on strings]
  539.  
  540.    Omit "lexicographic" in the description of < on strings.
  541.  
  542. p.122 [iteration protocol]
  543.  
  544.    "Use of the iteration protocol is based on the assumption..."  if this
  545.    assumption is violated, can it cause failures which cause the system to
  546.    fail?  That is, could it lead to a core dump?
  547.  
  548. p.123 [iteration protocol]
  549.  
  550.    What should a class which cannot implement every piece of the iteration
  551.    protocol do?  This should be clarified.
  552.  
  553.    Is backward-iteration-protocol required to produce the items in reverse
  554.    order from forward-iteration-protocol?  It probably should be.
  555.  
  556. p.129 [<explicit-key-collection>]
  557. p.131 [<mutable-explicit-key-collection>]
  558.  
  559.    The classes <explicit-key-collection> and
  560.    <mutable-explicit-key-collection> aren't necessary any more with the new
  561.    iteration protocol.  They should probably go away.
  562.  
  563. p.135 [<character>]
  564. p.136 [<symbol>]
  565.  
  566.    Are <character> and <symbol> really suitable arguments to make?
  567.    Are they sealed classes?
  568.  
  569. p.135 [as]
  570.  
  571.    Are the methods on as that convert between characters and integers
  572.    required to be inverses of each other?
  573.  
  574. p.137 [Numbers chapter]
  575.  
  576.    This chapter doesn't explain the syntax of numbers.
  577.  
  578.    The graphic at the beginning of the chapter is inaccurate about which
  579.    classes are abstract and/or instantiable.
  580.  
  581.    Are all implementations required to support all three float formats?  Is
  582.    IEEE format really required?
  583.  
  584. p.138 [numeric classes]
  585.  
  586.    There should be some text to describe these classes!
  587.  
  588.    The guaranteed precision of <integer> should be specified to be "at
  589.    least 28 bits."
  590.  
  591. p. 139 [/ undefined on integers]
  592.    This page fails to note that / on integers is undefined.
  593.  
  594. pp.139-141 [Arithmetic Operations]
  595.  
  596.    Are the type restrictions on the G.F.'s that are implied by these
  597.    descriptions accurate?  i.e, expt number1 integer2?
  598.  
  599.    Are logior, logxor, and logand really G.F.s?
  600.  
  601.    It's not true that rationalize is the same as Scheme, because the Scheme
  602.    function of that name has two required arguments.
  603.  
  604. p. 161 [do-handlers]
  605.    The description of "do-handlers" says the "init-arguments" argument to
  606.    funarg will be #f if unsupplied by the handler.  The "init-arguments"
  607.    argument actually defaults to an empty sequence.
  608.  
  609. p. 163 [modules overview]
  610.    Second paragraph of the "Overview" section:
  611.       "Is an error" is too weak of a classification for importing or
  612.       creating two variables with the same name in the same module.
  613.  
  614.    Third paragraph of the "Overview" section:
  615.       "Owned variables are created by a create clause in a define module and
  616.        in some cases by definitions associated with a module."
  617.    The quoted expression could be misleading.  It seems to some that it is
  618.    more likely that a variable will be created by a definition rather than
  619.    through the create option to "define module".
  620.  
  621. p.171-173 [Libraries chapter]
  622.  
  623.    This chapter is far too terse.
  624.  
  625.    The Dylan module, Dylan-user module, and Dylan library should be
  626.    mentioned at the beginning of the preceding modules chapter, and
  627.    preferably earlier in the book as well, not snuck into the back of the
  628.    libraries chapter.
  629.  
  630. p.177 [BNF notation notes]
  631.  
  632.    The BNF needs to have a better description of its notation.
  633.  
  634.    Note: the notation is not really BNF.  BNF is the name of a different
  635.    notation.
  636.  
  637.    Note: The Annotated C++ Reference Manual, by Ellis and Stroustrup,
  638.    uses the same  notation (except without "...")
  639.  
  640.    The BNF does not list the definition of the non-terminals DEFINE-WORD,
  641.    SIMPLE-BEGIN-WORD, EXPR-BEGIN-WORD, BEGIN-WORD, SIMPLE-INTERMEDIATE-WORD,
  642.    EXPR-INTERMEDIATE-WORD, and INTERMEDIATE-WORD.  They should be:
  643.  
  644.    simple-begin-word:
  645.         one of  begin case
  646.    expr-begin-word:
  647.         one of  if unless until while
  648.    begin-word:
  649.         one of  block for select
  650.    simple-intermediate-word:
  651.         one of  cleanup else finally
  652.    expr-intermediate-word:
  653.         one of  elseif
  654.    intermediate-word:
  655.         one of  exception
  656.    define-word:
  657.         one of  class constant library module variable
  658.  
  659.    The BNF does not support seal generic.  The right solution is probably
  660.    to choose a new syntax for it rather than to kludge up the grammar to
  661.    support the existing syntax, since the existing syntax was only intended as
  662.    a placeholder.
  663.  
  664.